package com.bestcem.xm.member.handler.imports.easyexcel;//package com.bestcem.xm.member.handler.imports.easyexcel;
//
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.util.ObjectUtil;
//import cn.hutool.core.util.StrUtil;
//import com.alibaba.excel.context.AnalysisContext;
//import com.alibaba.excel.event.AnalysisEventListener;
//import com.alibaba.excel.metadata.CellData;
//import com.alibaba.fastjson.JSONArray;
//import com.alibaba.fastjson.JSONObject;
//import com.bestcem.xm.member.entity.mongo.Project;
//import com.bestcem.xm.member.entity.pojo.ProjectDO;
//import com.bestcem.xm.member.grpc.service.param.imports.ImportProjectsParam;
//import com.bestcem.xm.member.service.ImportService;
//import com.bestcem.xm.member.service.MemberService;
//import com.bestcem.xm.member.service.ProjectService;
//import com.bestcem.xm.member.service.dto.FieldDTO;
//import com.bestcem.xm.member.util.CheckUtil;
//import com.bestcem.xm.member.util.ImportRecordStatusEnum;
//import com.bestcem.xm.common.core.domain.web.ServiceResult;
//import lombok.Getter;
//import lombok.Setter;
//import lombok.extern.slf4j.Slf4j;
//
//import java.util.*;
//
//import static com.bestcem.xm.member.util.Constants.PROJECT_FIELD_NAME_AND_FIELD_MAP;
//
///**
// * 解析个人联系人数据
// *
// * @author yf.wang <yf.wang@idiaoyan.com>
// * @version V1.0
// * @date 2021/7/22
// */
//@Slf4j
//@Getter
//@Setter
//public class ReadProjectListener extends AnalysisEventListener<Map<Integer, String>> {
//
//    private List<String> headers;
//
//    private ImportProjectsParam param;
//
//    private MemberService memberService;
//
//    private ImportService importService;
//
//    private ProjectService projectService;
//
//    private Map<String, FieldDTO> fieldMap;
//
//    private Integer per;
//
//    private Integer count;
//
//    private boolean isGetCount;
//
//    private Boolean isStop;
//
//    private JSONArray errorMsgJsons;
//
//    /**
//     * 每50个联系人存储一下
//     */
//    private static final int BATCH_COUNT = 50;
//
//
//    @Override
//    public void onException(Exception e, AnalysisContext analysisContext) throws Exception {
//        if (log.isInfoEnabled()) {
//            log.info("执行失败", e);
//        }
//    }
//
//    /**
//     * 获取表头数据
//     *
//     * @param map
//     * @param analysisContext
//     */
//    @Override
//    public void invokeHead(Map map, AnalysisContext analysisContext) {
//        // 获取表头数据
//        if (log.isInfoEnabled()) {
//            log.info("开始获取表头数据");
//        }
//        headers = new ArrayList<>();
//        map.forEach((k, v) -> {
//            CellData v1 = (CellData) v;
//            headers.add(v1.getStringValue());
//        });
//        if (CollUtil.isEmpty(headers)) {
//            if (log.isInfoEnabled()) {
//                log.info("没有表头数据");
//            }
//            isStop = true;
//            return;
//        }
//        if (log.isInfoEnabled()) {
//            log.info("开始校验表头数据");
//        }
//        // 校验主键key
//
//        // 校验表头
//        Set<String> headerSet = new HashSet<>(headers.size());
//        headerSet.addAll(headers);
//        if (headers.size() != headerSet.size()) {
//            // 列名不唯一
//            isStop = true;
//            // 更新错误信息
//            importService.updateImportRecordErrorMessage("0", "列名不唯一", param.getRecordId(), ImportRecordStatusEnum.IMPORT_RECORD_STATUS_FAILED.getIndex());
//            return;
//        }
//    }
//
//    /**
//     * 这个每一条数据解析都会来调用
//     *
//     * @param data
//     * @param analysisContext
//     */
//    @Override
//    public void invoke(Map<Integer, String> data, AnalysisContext analysisContext) {
//        if (!isGetCount) {
//            // 获取总行数
//            Integer approximateTotalRowNumber =
//                    analysisContext.readSheetHolder().getApproximateTotalRowNumber() - 1;
//            count = approximateTotalRowNumber;
//            if (approximateTotalRowNumber == 0) {
//                // 没有数据
//                isStop = true;
//                return;
//            }
//            per = importService.getCalcUpdateProgressStep(count);
//            // 初始化进度
//            importService.setProgressBarStatus(0, param.getRecordId(), 0, count);
//            isGetCount = true;
//        }
//        if (log.isInfoEnabled()) {
//            log.info("解析到一条数据:{}", JSONObject.toJSONString(data));
//        }
//        // 获取当前解析的行数
//        Integer rowIndex = analysisContext.readRowHolder().getRowIndex();
//        handle(data, rowIndex);
//        // 每per条更新一次进度
//        if ((rowIndex - 1) % per == 0) {
//            // 每per条更新一次进度
//            importService.setProgressBarStatus(0, param.getRecordId(), (rowIndex - 1), count);
//        }
//    }
//
//    @Override
//    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//        if (log.isInfoEnabled()) {
//            log.info("所有数据解析完成");
//        }
//        //设置进度条结束
//        importService.setProgressBarStatus(0, param.getRecordId(), count, count);
//        int failedCount = errorMsgJsons.size();
//        JSONObject dataJson = new JSONObject();
//        dataJson.put("receiveCount", count);
//        dataJson.put("successCount", count - failedCount);
//        dataJson.put("failedCount", failedCount);
//        dataJson.put("total_error_msg", errorMsgJsons);
//        importService.updateImportRecordData(param.getRecordId(), dataJson, ImportRecordStatusEnum.IMPORT_RECORD_STATUS_SUCCESS.getIndex());
//    }
//
//    private ServiceResult<String> handle(Map<Integer, String> data, Integer rowIndex) {
//        JSONObject projectJson = buildProjectJson(data);
//
//        String errorMessage = checkErrorMsg(projectJson, rowIndex);
//        if (StrUtil.isNotEmpty(errorMessage)) {
//            JSONObject errorMsgJson = new JSONObject();
//            errorMsgJson.put(String.valueOf(rowIndex), errorMessage);
//            errorMsgJsons.add(errorMsgJson);
//        }
//
//        extendFieldCheck(projectJson);
//        ProjectDO project = buildProject(projectJson, param);
//
//        save(project);
//        return ServiceResult.success();
//    }
//
//    private ProjectDO buildProject(JSONObject projectJson, ImportProjectsParam param) {
//        // 获取项目信息
//        ProjectDO project = projectService.findOneByOrgIdAndName(param.getOrgId(), projectJson.getString("m_project_name"));
//        String interiorMemberName = projectJson.getString("account_manager");
//        // 获取 客户经理 id
//
//        if (!ObjectUtil.isEmpty(project)) {
//            // 更新
//            project.setOrgId(param.getOrgId());
//
//        } else {
//            // 插入
//            project = new ProjectDO();
//        }
//        return project;
//    }
//
//    private void extendFieldCheck(JSONObject projectJson) {
//    }
//
//    /**
//     * 构建数据
//     *
//     * @param data
//     * @return
//     */
//    private JSONObject buildProjectJson(Map<Integer, String> data) {
//        JSONObject memberJson = new JSONObject();
//        for (int i = 0; i < headers.size(); i++) {
//            String headName = headers.get(i);
//            memberJson.put(PROJECT_FIELD_NAME_AND_FIELD_MAP.get(headName), data.getOrDefault(i, ""));
//        }
//        return memberJson;
//    }
//
//
//    /**
//     * 校验数据
//     *
//     * @param memberJson
//     * @param rowIndex
//     */
//    private String checkErrorMsg(JSONObject memberJson, Integer rowIndex) {
//        StringBuilder errMessage = new StringBuilder();
//        String instituteName = memberJson.getString("institute_name");
//        if (StrUtil.isEmpty(instituteName)) {
//            errMessage.append("机构名称不能为空 ");
//        }
//
//        // 机构名称查询不到对应的机构联系人
//
//        if (instituteName.length() > 20) {
//            errMessage.append("项目名称最长20个字 ");
//        }
//        String mPType = memberJson.getString("m_p_type");
//        if (mPType.length() > 8) {
//            errMessage.append("立项类型最长8个字 ");
//        }
//
//        String contractNo = memberJson.getString("contractNo");
//        if (contractNo.length() > 20) {
//            errMessage.append("合同编号最长20个字 ");
//        }
//
//        String projectManager = memberJson.getString("project_manager");
//        if (projectManager.length() > 4) {
//            errMessage.append("甲方项目经理最长4个字 ");
//        }
//
//        String mProjectName = memberJson.getString("m_project_name");
//        if (StrUtil.isEmpty(mProjectName)) {
//            errMessage.append("项目名称为必填字段 ");
//        }
//
//
//        // 校验手机号
//        String mobile = memberJson.getString("project_manager_mobile");
//        if (StrUtil.isNotEmpty(mobile)) {
//            ServiceResult<String> result = CheckUtil.checkMobilePhoneFormat(mobile);
//            if (!result.isSuccess()) {
//                errMessage.append("手机号格式错误 ");
//            }
//        }
//
//        // 检查项目编号重复
//
//        log.info(" 第 {} 行 {}", rowIndex, errMessage.toString());
//        return errMessage.toString();
//    }
//
//
//    private String dealUpdateField(String inputValue, String exitValue) {
//        if (StrUtil.isNotEmpty(inputValue)) {
//            if (param.getExistedUpdate()) {
//                return inputValue;
//            }
//        } else {
//            if (param.getNullUpdate()) {
//                return inputValue;
//            }
//        }
//        return exitValue;
//    }
//
//
//    private void save(ProjectDO project) {
//        if (StrUtil.isNotEmpty(project.getProjectId())) {
//            projectService.updateProject(project);
//        } else {
//            // 创建
//            projectService.createProject(project);
//        }
//    }
//
//    /**
//     * 重写hasNext 为了实现有问题直接退出
//     *
//     * @param context
//     * @return
//     */
//    @Override
//    public boolean hasNext(AnalysisContext context) {
//        return !isStop;
//    }
//}
